//
//  basic_cal_matrix.h
//  linear_algebra
//
//  Created by zhangnan on 2025/3/25.
//

#ifndef basic_cal_matrix_h
#define basic_cal_matrix_h

#include <stdio.h>
#include "matrix.h"


/**
 * 对两个双精度浮点数矩阵对象进行加法运算。
 * 
 * 该函数接收两个指向 MATRIX_DOUBLE_TYPE 类型的矩阵对象的指针作为输入，并返回一个新的 MATRIX_DOUBLE_TYPE 类型的矩阵对象，表示两者的加法结果。
 * 需要注意的是，该函数假定输入的两个矩阵具有适合加法操作的相同维度，调用者需确保此兼容性。
 * 
 * @param a 指向第一个 MATRIX_DOUBLE_TYPE 类型的矩阵对象。
 * @param b 指向第二个 MATRIX_DOUBLE_TYPE 类型的矩阵对象。
 * @return 返回指向新创建的 MATRIX_DOUBLE_TYPE 类型矩阵对象的指针，表示加法结果；如果操作失败（例如由于维度不兼容），则返回 NULL。
 */
MATRIX_DOUBLE_TYPE* add_double(MATRIX_DOUBLE_TYPE *a, MATRIX_DOUBLE_TYPE *b);

/**
 * 对两个双精度浮点数矩阵对象进行减法运算。
 * 
 * 该函数接收两个指向 MATRIX_DOUBLE_TYPE 类型的矩阵对象的指针作为输入，并返回一个新的 MATRIX_DOUBLE_TYPE 类型的矩阵对象，表示两者的减法结果。
 * 需要注意的是，该函数假定输入的两个矩阵具有适合减法操作的相同维度，调用者需确保此兼容性。
 * 
 * @param a 指向第一个 MATRIX_DOUBLE_TYPE 类型的矩阵对象。
 * @param b 指向第二个 MATRIX_DOUBLE_TYPE 类型的矩阵对象。
 * @return 返回指向新创建的 MATRIX_DOUBLE_TYPE 类型矩阵对象的指针，表示减法结果；如果操作失败（例如由于维度不兼容），则返回 NULL。
 */
MATRIX_DOUBLE_TYPE* sub_double(MATRIX_DOUBLE_TYPE *a, MATRIX_DOUBLE_TYPE *b);

/**
 * 对两个双精度浮点数矩阵对象进行乘法运算。
 * 
 * 该函数接收两个指向 MATRIX_DOUBLE_TYPE 类型的矩阵对象的指针作为输入，并返回一个新的 MATRIX_DOUBLE_TYPE 类型的矩阵对象，表示两者的乘法结果。
 * 需要注意的是，该函数假定输入的两个矩阵具有适合乘法操作的维度，调用者需确保此兼容性。
 * 
 * @param a 指向第一个 MATRIX_DOUBLE_TYPE 类型的矩阵对象。
 * @param b 指向第二个 MATRIX_DOUBLE_TYPE 类型的矩阵对象。
 * @return 返回指向新创建的 MATRIX_DOUBLE_TYPE 类型矩阵对象的指针，表示乘法结果；如果操作失败（例如由于维度不兼容），则返回 NULL。
 */
MATRIX_DOUBLE_TYPE* mul_double(MATRIX_DOUBLE_TYPE *a, MATRIX_DOUBLE_TYPE *b);

/**
 * 将双精度浮点数矩阵对象与标量值相乘。
 * 
 * 该函数接收一个指向 MATRIX_DOUBLE_TYPE 类型的矩阵对象的指针和一个 double 类型的标量值作为输入，并返回一个新的 MATRIX_DOUBLE_TYPE 类型的矩阵对象，表示两者相乘的结果。
 * 
 * @param a 指向 MATRIX_DOUBLE_TYPE 类型的矩阵对象。
 * @param b double 类型的标量值。
 * @return 返回指向新创建的 MATRIX_DOUBLE_TYPE 类型矩阵对象的指针，表示乘法结果；如果操作失败，则返回 NULL。
 */
MATRIX_DOUBLE_TYPE* mul_double_scalar(MATRIX_DOUBLE_TYPE *a, double b);

/**
 * 对两个整型矩阵进行加法运算。
 * 
 * 该函数接收两个指向 MATRIX_INT_TYPE 类型的矩阵对象的指针作为输入，并返回一个新的 MATRIX_INT_TYPE 类型的矩阵对象，表示两者的加法结果。
 * 
 * @param a 指向第一个 MATRIX_INT_TYPE 类型的矩阵对象。
 * @param b 指向第二个 MATRIX_INT_TYPE 类型的矩阵对象。
 * @return 返回指向新创建的 MATRIX_INT_TYPE 类型矩阵对象的指针，表示加法结果。
 */
MATRIX_INT_TYPE* add_int(MATRIX_INT_TYPE *a, MATRIX_INT_TYPE *b);

/**
 * 对两个整型矩阵进行减法运算。
 * 
 * 该函数接收两个指向 MATRIX_INT_TYPE 类型的矩阵对象的指针作为输入，并返回一个新的 MATRIX_INT_TYPE 类型的矩阵对象，表示两者的减法结果。
 * 
 * @param a 指向第一个 MATRIX_INT_TYPE 类型的矩阵对象。
 * @param b 指向第二个 MATRIX_INT_TYPE 类型的矩阵对象。
 * @return 返回指向新创建的 MATRIX_INT_TYPE 类型矩阵对象的指针，表示减法结果。
 */
MATRIX_INT_TYPE* sub_int(MATRIX_INT_TYPE *a, MATRIX_INT_TYPE *b);

/**
 * 对两个整型矩阵进行乘法运算。
 * 
 * 该函数接收两个指向 MATRIX_INT_TYPE 类型的矩阵对象的指针作为输入，并返回一个新的 MATRIX_INT_TYPE 类型的矩阵对象，表示两者的乘法结果。
 * 
 * @param a 指向第一个 MATRIX_INT_TYPE 类型的矩阵对象。
 * @param b 指向第二个 MATRIX_INT_TYPE 类型的矩阵对象。
 * @return 返回指向新创建的 MATRIX_INT_TYPE 类型矩阵对象的指针，表示乘法结果。
 */
MATRIX_INT_TYPE* mul_int(MATRIX_INT_TYPE *a, MATRIX_INT_TYPE *b);

/**
 * 将整型矩阵与标量值相乘。
 * 
 * 该函数接收一个指向 MATRIX_INT_TYPE 类型的矩阵对象的指针和一个 int 类型的标量值作为输入，并返回一个新的 MATRIX_INT_TYPE 类型的矩阵对象，表示两者相乘的结果。
 * 
 * @param a 指向 MATRIX_INT_TYPE 类型的矩阵对象。
 * @param b int 类型的标量值。
 * @return 返回指向新创建的 MATRIX_INT_TYPE 类型矩阵对象的指针，表示乘法结果。
 */
MATRIX_INT_TYPE* mul_int_scalar(MATRIX_INT_TYPE *a, int b);

/**
 * 转置双精度浮点数类型的矩阵。
 * 
 * @param a 指向需要转置的 MATRIX_DOUBLE_TYPE 类型矩阵对象。
 * @return 返回指向转置后 MATRIX_DOUBLE_TYPE 类型矩阵对象的指针。
 */
MATRIX_DOUBLE_TYPE* transpose_double(MATRIX_DOUBLE_TYPE *a);

/**
 * 转置整型矩阵。
 * 
 * @param a 指向需要转置的 MATRIX_INT_TYPE 类型矩阵对象。
 * @return 返回指向转置后 MATRIX_INT_TYPE 类型矩阵对象的指针。
 */
MATRIX_INT_TYPE* transpose_int(MATRIX_INT_TYPE *a);



#endif /* basic_cal_matrix_h */
